--座位逻辑
--管理玩家所有数据（玩家信息，牌数据，游戏信息等）
--

local tabletool = require "tabletool"
local filelog = require "filelog"
local timer = require "timer"
local timetool = require "timetool"

require "mjexenum"

local SeatLogic = {}
local service = nil


function SeatLogic.init(caller)
	service = caller
end

-----------------------------

--
--初始化座位数据
--
function SeatLogic.init_data(seat, index)
	seat.index = index
	seat.state = EMJSeatState.SEAT_STATE_NO_PLAYER

    --玩家信息
	seat.playerinfo = {
		rolename = "",      --名字
        level = 0,          --等级
		logo = "",          --头像
		sex = 0,            --性别
        coin = 0,           --金币
        dou = 0,            --金豆
        diamond = 0,        --钻石
        lock_diamond = 0,   --保险箱钻石
        fangka = 0,         --房卡
        lottery = 0,        --奖券
		ip_addr = "",       --ip地址
        recommrid =  0,     --推荐人rid
		agencyrid =  0,     --代理rid
		agencylevel =  0,   --代理等级，0表示不是代理
		gps_addr = "",      --地理位置
        intro = "",         --个人信息
        upvoted_num = 0,    --被赞数
        downvoted_num = 0,  --被踩数
        logoframe = 0,      --头像框
	}
    
    seat.is_banker = false
    seat.is_leave = false           --是否离开
	seat.is_tuoguan = false         --是否托管
    seat.in_tuoguan = false         --是否托管中
	seat.is_robot = false           --是否为机器人
    seat.is_disconnected = false    --玩家是否断线
	seat.offline = 0                --是否离线 1离线，0在线

    seat.action_timeout_time = 0    --超时间隔时间，单位s
    seat.timeout_count = 0          --超时次数

    seat.card_num = 0               --手牌数
    seat.fan_types = { }            --番型数组
    seat.cards = { }                --手牌
    seat.out_cards = { }            --已出牌
    seat.di_cards = { }             --碰牌

    --战绩信息
	seat.curr_score = 0      --当前得分
    seat.balance_score = 0   --结算分
    seat.fan_cnt = 0         --当前局获得的总番值
	seat.total_score = 0     --总得分
	seat.win_num = 0         --记录胜利次数
	seat.fail_num = 0        --记录玩家失败次数
	seat.draw_num = 0        --记录玩家平局次数 
    seat.lottery_num = 0     --获得奖券数

    seat.gang_add_mutil = 0    --杠加倍数
	seat.zimo_add_mutil = 0    --如果自摸加底记录自摸加的底倍数

    seat.is_hupai = false      --记录玩家当前是否已经胡牌
	seat.is_gang = false       --记录玩家是否杠牌
	seat.hupai_card = 0        --玩家胡牌的牌 0表示无
    seat.hupai_type = 0         --胡牌类型
	seat.yinhu_seat_index = 0  --记录引胡玩家座位号，和当前座位相同表示胡三家，不相同引胡玩家即是点炮玩家

	seat.curr_mo_paicard = 0    --当前摸的牌

	seat.tuoguan_doaction_timerid = -1  --托管操作计时器
    seat.ready_timer_id = -1            --准备计时器

    seat.had_huansanzhang = false       --是否已经换三张
    seat.que_cardcolor = nil            --缺牌花色 0 1 2
    seat.is_can_half_leave = false      --是否可以中途退出
    seat.ready_timeout_time = 0         --准备超时时间
    seat.has_leave = false              --已经离桌标记
    seat.is_giveup = false              --是否认输

	return true
end

--
--判断座位是否有人
--
function SeatLogic.is_empty(seat)
	return (seat.state == EMJSeatState.SEAT_STATE_NO_PLAYER or seat.rid <= 0)
end

--
--清空角色相关数据
--
function SeatLogic.clear(seat)
	seat.rid = 0
	seat.state = EMJSeatState.SEAT_STATE_UNKNOW  --更改坐位玩家状态，未知
	seat.playerinfo = {}
end

----------------------------------------

--
--清空座位数据
--
function SeatLogic.clear_seat(seat)
	seat.rid = 0
	seat.state = EMJSeatState.SEAT_STATE_NO_PLAYER

	seat.playerinfo.rolename = ""
	seat.playerinfo.logo=""
	seat.playerinfo.sex = 0
    seat.playerinfo.coin = 0                   --玩家金币
    seat.playerinfo.dou = 0                    --玩家金豆
	seat.playerinfo.lottery = 0                --奖券
    seat.playerinfo.fangka = 0                 --玩家身上的房卡
    seat.playerinfo.diamond = 0                --玩家的钻石
    seat.playerinfo.ip_addr = ""
    seat.playerinfo.lock_diamond = 0
    seat.playerinfo.recommrid =  0     --推荐人rid
	seat.playerinfo.agencyrid =  0     --代理rid
	seat.playerinfo.agencylevel =  0   --代理等级，0表示不是代理
    seat.playerinfo.level = 0
    seat.playerinfo.intro = ""
    seat.playerinfo.upvoted_num = 0    --被赞数
    seat.playerinfo.downvoted_num = 0  --被踩数
    seat.playerinfo.logoframe = 0      --头像框

    seat.is_banker = false
    seat.is_leave = false           --是否离开
	seat.is_tuoguan = false
    seat.in_tuoguan = false         --是否托管中
	seat.is_robot = false
    seat.is_disconnected = false    --玩家是否断线

	seat.timeout_count = 0          --超时次数
	
    seat.fan_types = { }            --番型数组
    seat.card_num = 0               --手牌数
	seat.cards = {}                 --记录玩家手牌
	seat.out_cards = {}             --记录玩家打的牌
	seat.di_cards = {}              --记录玩家杠碰信息
     --[[
         [1] = {
	        optional int32 card = 3;			   		// 牌值
	        optional int32 gang_peng_type	= 1;		// 杠碰类型 1碰后模,2 碰杠,3 暗杠	
	        optional int32 gang_seat_index	= 2;		// 喂碰杠牌玩家座位号,0,自摸的暗杠
        }
    ]]

    --战绩信息
	seat.curr_score = 0      --当前得分
    seat.balance_score = 0   --结算分
    seat.fan_cnt = 0         --当前局获得的总番值
	seat.total_score = 0     --总得分
	seat.win_num = 0         --记录胜利次数
	seat.fail_num = 0        --记录玩家失败次数
	seat.draw_num = 0        --记录玩家平局次数 
    seat.lottery_num = 0       --获得奖券数

    seat.gang_add_mutil = 0    --杠加倍数
	seat.zimo_add_mutil = 0    --如果自摸加底记录自摸加的底倍数

    seat.is_hupai = false      --记录玩家当前是否已经胡牌
	seat.is_gang = false       --记录玩家是否杠牌
	seat.hupai_card = 0        --玩家胡牌的牌 0表示无
	seat.yinhu_seat_index = 0  --记录引胡玩家座位号，和当前座位相同表示胡三家，不相同引胡玩家即是点炮玩家

	seat.curr_mo_paicard = 0    --当前摸的牌
	seat.hupai_type = 0         --胡牌类型

    seat.had_huansanzhang = false       --是否已经换三张
    seat.que_cardcolor = nil           --缺牌花色 0 1 2
    seat.is_guohu = nil
    seat.guohu_cards = nil
    seat.guohu_max_fan = nil
    seat.guohu_seat_index = nil
    seat.is_can_half_leave = false      --是否可以中途退出
    seat.ready_timeout_time = 0         --准备超时时间
    seat.has_leave = false              --已经离桌标记
    seat.is_giveup = false              --是否认输
    seat.is_gameend = nil               --是否已结束游戏

     --关闭托管操作计时器
	if seat.tuoguan_doaction_timerid and seat.tuoguan_doaction_timerid > 0 then
		timer.cleartimer(seat.tuoguan_doaction_timerid)
	end 
	seat.tuoguan_doaction_timerid = -1

     --关闭准备计时器
    if seat.ready_timer_id and seat.ready_timer_id > 0 then
		timer.cleartimer(seat.ready_timer_id)
	end 
    seat.ready_timer_id = -1   

end

--
--处理托管
--
function SeatLogic.dealtuoguan(gameobj,seat)
end

--
--取消托管
--
function SeatLogic.canceltuoguan(gameobj,seat)

end

--[Comment]
-- 一局开始后，初始化座位
--
function SeatLogic.onegamestart_initseat(seat)
	seat.state = EMJSeatState.SEAT_STATE_PLAYING  --游戏中
	
	seat.cards = {}          --记录玩家手牌

	seat.fan_types = {}

	seat.out_cards = {} --记录玩家打的牌

	seat.di_cards = {}         --记录玩家杠碰牌

	seat.winhupai_fan_info = {} --记录玩家胡牌赢取玩家的座位

	seat.curr_score = 0        --当前得分
    seat.balance_score = 0     --结算分
	seat.is_gang = false
	seat.is_banker = false     --是否庄家
	seat.hupai_card = 0        --玩家胡牌的牌 0表示无
	seat.gang_add_mutil = 0    --杠加倍数
	seat.zimo_add_mutil = 0    --如果自摸加底记录自摸加的底倍数
	seat.lottery_num = 0       --获得奖券数
	seat.fan_cnt = 0           --当前局获得的总翻值
	seat.is_hupai = false      --记录玩家当前是否已经胡牌
	seat.yinhu_seat_index = 0     --记录引胡玩家座位号，和当前座位相同表示胡三家，不相同引胡玩家即是点炮玩家

	seat.curr_mo_paicard = 0
	seat.hupai_type = 0
	seat.had_huansanzhang = false      --是否已经换三张
    seat.que_cardcolor = nil           --缺牌花色 0 1 2
    seat.is_guohu = nil
    seat.guohu_cards = nil
    seat.guohu_max_fan = nil
    seat.guohu_seat_index = nil
    seat.is_can_half_leave = false      --是否可以中途退出
    seat.ready_timeout_time = 0         --准备超时时间
    seat.is_tuoguan = false
    seat.in_tuoguan = false
    seat.has_leave = false              --已经离桌标记
    seat.is_giveup = false              --是否认输
    seat.is_gameend = nil               --是否已结束游戏

	if seat.tuoguan_doaction_timerid and seat.tuoguan_doaction_timerid > 0 then
		timer.cleartimer(seat.tuoguan_doaction_timerid)
	end 
	seat.tuoguan_doaction_timerid = -1

     --关闭准备计时器
    if seat.ready_timer_id and seat.ready_timer_id > 0 then
		timer.cleartimer(seat.ready_timer_id)
	end 
    seat.ready_timer_id = -1  
    
    if seat.is_robot then
        seat.is_tuoguan = true
        seat.in_tuoguan = true         --是否托管中
    end   
end

--[Comment]
-- 一局结束后，初始化座位
--
function SeatLogic.onegameend_initseat(seat)
	seat.state = EMJSeatState.SEAT_STATE_WAIT_READY
	seat.cards = {}          --记录玩家手牌
	
	seat.fan_types = {}

	seat.di_cards = {}         --记录玩家杠碰牌

	seat.winhupai_fan_info = {} --记录玩家胡牌赢取玩家的座位

    seat.out_cards = {} --记录玩家打的牌

	seat.curr_score = 0      --当前得分
    seat.balance_score = 0   --结算分
	seat.is_gang = false
	seat.is_banker = false     --是否庄家 
	seat.hupai_card = 0        --玩家胡牌的牌 0表示无
	seat.gang_add_mutil = 0    --杠加倍数
	seat.zimo_add_mutil = 0    --如果自摸加底记录自摸加的底倍数
	seat.lottery_num = 0       --获得奖券数
	seat.fan_cnt = 0           --当前局获得的总翻值

	seat.is_hupai = false      --记录玩家当前是否已经胡牌
	seat.yinhu_seat_index = 0  --记录引胡玩家座位号，和当前座位相同表示胡三家，不相同引胡玩家即是点炮玩家

	seat.curr_mo_paicard = 0
	seat.is_tuoguan = false
    seat.in_tuoguan = false         --是否托管中
	seat.hupai_type = 0
	seat.had_huansanzhang = false       --是否已经换三张
    seat.que_cardcolor = nil           --缺牌花色 0 1 2
    seat.is_guohu = nil
    seat.guohu_cards = nil
    seat.guohu_max_fan = nil
    seat.guohu_seat_index = nil
    seat.is_can_half_leave = false      --是否可以中途退出
    seat.is_giveup = false              --是否认输
    seat.is_gameend = nil               --是否已结束游戏

	if seat.tuoguan_doaction_timerid and seat.tuoguan_doaction_timerid > 0 then
		timer.cleartimer(seat.tuoguan_doaction_timerid)
	end 
    seat.tuoguan_doaction_timerid = -1
end

--处理玩家离线
--deal_player_offline
--
function SeatLogic.deal_player_offline(seat)
	if not seat then return end
	local leavetablemsg = {
			rid = seat.rid,
            seat_index = seat.index,
	}

    local tablelogic = service:get_logicbyname("tablelogic")
	tablelogic.sendmsg_to_alltableplayer(service.table_data, "disconnectN", leavetablemsg)
end

return SeatLogic